Basic scATAC-seq data analysis

Vignette for ArchR: https://www.archrproject.com/bookdown/getting-started-with-archr.html

Overview

  1. Create Arrow Files
  2. Create and process ArchRProjects
    a) Sample Statistics
    b) Cell Statistics
  3. Filtering I
    a) Filtering by minimal number of fragments
    b) Filtering by minimal TSS enrichment score
    c) Sample Statistics
    d) Cell Statistics
    e) Low-dimensional embeddings
  4. Doublet Detection
    a) Amulet
    b) Correlation with sequencing depth
    c) Inspect doublets
  5. Filtering II
    a) Filtering by doublets
    b) Sample Statistics
    c) Cell Statistics
    d) Separate single-cell embeddings
  6. Clustering of single cells
    a) Evaluate different clustering resolutions
    b) Cluster cells
    c) Single-cell embeddings
    d) Sample Statistics
    e) Cell Statistics
  7. Save ArchRProject

Input data

  1. 10x Genomics scATAC-seq with original Tn5 transposase from 10x Genomics of IFNb6h MEFs
    MEF_IFNb6h_10xTn5_CellRangerATAC_fragments.tsv.gz
  2. 10x Genomics scATAC-seq with 30 percent Tn5hc of IFNb6h MEFs
    MEF_IFNb6h_Tn5hc_30perc_CellRangerATAC_fragments.tsv.gz
  3. 10x Genomics scTurboATAC-seq of IFNb6h MEFs
    MEF_IFNb6h_Tn5hc_CellRangerATAC_fragments.tsv.gz

Notebook

20230912_MEF_IFNb6h_UMAP.ipynb


0. Load libraries, scripts and data

### Libraries
library(magrittr)
library(ArchR)
library(ggpubr)
library(purrr)
library(Seurat)
library(parallel)
library(scDblFinder)
library(qs)
source("plotCellQuality.R")
source("plotUmapQC.R")
source("plotUmapClusters.R")
source("plotUmaps.R")
### Set ArchR parameters.
addArchRThreads(threads = 30) # number of parallel threads
addArchRGenome("mm10") # genome and gene annotation ("hg19", "hg38", "mm9", "mm10")
### Set HDF5 environment variables to prevent HDF5 error later
Sys.setenv(HDF5_USE_FILE_LOCKING=FALSE)
Sys.setenv(RHDF5_USE_FILE_LOCKING=FALSE)
### Samples
samples <- c("MEF_IFNb6h_10xTn5", "MEF_IFNb6h_Tn5hc_30perc", "MEF_IFNb6h_Tn5hc")

### Sample palette
sample_palette <- c("#68c6a4", "#f2b531", "#ed5958")
names(sample_palette) <- samples
### Data
inputFiles <- c("MEF_IFNb6h_10xTn5_CellRangerATAC_fragments.tsv.gz",
                "MEF_IFNb6h_Tn5hc_30perc_CellRangerATAC_fragments.tsv.gz",
                "MEF_IFNb6h_Tn5hc_CellRangerATAC_fragments.tsv.gz")
names(inputFiles) <- samples

1. Create Arrow Files

overview
ArrowFiles <- createArrowFiles(
  inputFiles = inputFiles,
  sampleNames = names(inputFiles),
  minTSS = 0, #Dont set this too high because you can always increase later
  minFrags = 100,
  maxFrags = 5000000,
  addTileMat = TRUE,
  addGeneScoreMat = FALSE,
  verbose = FALSE, 
  subThreading = FALSE 
)
names(ArrowFiles) <- gsub("\\.arrow", "", ArrowFiles)

2. Create and preprocess ArchRProjects

overview
proj_list <- list()

for (sample in samples){
    proj_list[[sample]] <- ArchRProject(
      ArrowFiles = ArrowFiles[[sample]], 
      outputDirectory = paste0("ArchRProj_", sample),
      copyArrows = TRUE #This is recommened so that if you modify the Arrow files you have an original copy for later usage.
    )
}

a) Sample Statistics

log10frags_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), log10nFrags = log10(x$nFrags))}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = log10nFrags)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("Number of fragments") + xlab("") + ylab("log10(nFrags)")
tss_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), tss = x$TSSEnrichment)}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = tss)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("TSS enrichment scores") + xlab("") + ylab("TSS enrichment score")
options(repr.plot.width=32, repr.plot.height=20)
ggarrange(log10frags_samples, tss_samples, ncol = 2)

b) Cell Statistics

minFrag <- list(c(3, 3.8), c(3, 3.9), c(4, 4.3))
names(minFrag) <- samples
minTSS <- list(c(4, 5), c(4, 12), c(4, 12))
names(minTSS) <- samples
p_list <- lapply(samples, function(sample){plotCellQuality(proj_list[[sample]], sample, groups = "Samples", 
                                                           set_xlim = c(2, 6.1), set_ylim = c(0, 50), 
                                                      cutoff_feature2 = minTSS[[sample]], cutoff_feature1 = minFrag[[sample]])})
names(p_list) <- samples
options(repr.plot.width=30, repr.plot.height=26)
ggarrange(plotlist = p_list, ncol = 2, nrow = 2)

3. Filtering I

overview

a) Filtering by minimal number of fragments

Filter cells by minFrag cutoff for a normal distribution of unique fragments per cell.

  • MEF_IFNb6h_10xTn5: 10^3.8
  • MEF_IFNb6h_Tn5hc_30perc: 10^3.9
  • MEF_IFNb6h_Tn5hc: 10^4.3
minFrag <- c(3.8, 3.9, 4.3)
names(minFrag) <- samples
proj_list <- lapply(names(proj_list), function(x){proj_list[[x]][proj_list[[x]]$cellNames[which(getCellColData(proj_list[[x]], select = "log10(nFrags)")[,1] >= minFrag[x])], ]})
names(proj_list) <- samples

b) Filtering by minimal TSS enrichment score

Filter cells by minTSS cutoff for a normal distribution of TSS enrichment scores per cell.

  • MEF_IFNb6h_10xTn5: 5
  • MEF_IFNb6h_Tn5hc_30perc: 12
  • MEF_IFNb6h_Tn5hc: 12
minTSS <- c(5, 12, 12)
names(minTSS) <- samples
proj_list <- lapply(names(proj_list), function(x){proj_list[[x]][proj_list[[x]]$cellNames[which(getCellColData(proj_list[[x]], select = "TSSEnrichment")[,1] > minTSS[x])], ]})
names(proj_list) <- samples

c) Sample Statistics

log10frags_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), log10nFrags = log10(x$nFrags))}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = log10nFrags)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("Number of fragments") + xlab("") + ylab("log10(nFrags)")
tss_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), tss = x$TSSEnrichment)}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = tss)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("TSS enrichment scores") + xlab("") + ylab("TSS enrichment score")
options(repr.plot.width=32, repr.plot.height=20)
ggarrange(log10frags_samples, tss_samples, ncol = 2)

d) Cell Statistics

p_list <- lapply(samples, function(sample){plotCellQuality(proj_list[[sample]], sample, groups = "Samples", 
                                                           set_xlim = c(2, 6.1), set_ylim = c(0, 50), 
                                                      cutoff_feature2 = minTSS[[sample]], cutoff_feature1 = minFrag[[sample]])})
names(p_list) <- samples
options(repr.plot.width=30, repr.plot.height=26)
ggarrange(plotlist = p_list, ncol = 2, nrow = 2)

e) Low-dimensional embeddings

proj_list <- lapply(proj_list, function(x){addIterativeLSI(
    ArchRProj = x,
    useMatrix = "TileMatrix", 
    name = "IterativeLSI", 
    iterations = 2, 
    clusterParams = list( #See Seurat::FindClusters
        resolution = c(0.2), 
        sampleCells = 10000, 
        n.start = 10
    ), 
    varFeatures = 25000, 
    dimsToUse = 1:30,
    force = TRUE
)})
IterativeLSI_list <- lapply(proj_list, function(x){getReducedDims(x, "IterativeLSI", returnMatrix = FALSE)})
options(repr.plot.width=21, repr.plot.height=5)
par(mfrow=c(1, 3))
for (x in samples){
    plot(IterativeLSI_list[[x]]$svd$d, bty='l', xlab='LSI components', main=x, ylab='SVD deviation', pch=16, cex.lab=1.2, cex.axis=1.1)
    plot(IterativeLSI_list[[x]]$svd$d, bty='l', xlab='LSI components', ylab='SVD deviation', pch=16, cex.lab=1.2, cex.axis=1.1, ylim=c(0,1500))
    plot(IterativeLSI_list[[x]]$corToDepth$none, bty='l', xlab='LSI components', ylab='Correlation to sequencing depth', pch=16, cex.lab=1.2, cex.axis=1.1)
}
LSIcomponents <- list(2:15, 2:16, 2:15)
names(LSIcomponents) <- samples
proj_list <- lapply(names(proj_list), function(x){addIterativeLSI(
    ArchRProj = proj_list[[x]],
    useMatrix = "TileMatrix", 
    name = "IterativeLSI", 
    iterations = 2, 
    clusterParams = list( #See Seurat::FindClusters
        resolution = c(0.2), 
        sampleCells = 10000, 
        n.start = 10
    ), 
    varFeatures = 25000, 
    dimsToUse = LSIcomponents[[x]],
    force = TRUE
)})

names(proj_list) <- samples
proj_list <- lapply(proj_list, function(x){addUMAP(
    ArchRProj = x, 
    reducedDims = "IterativeLSI", 
    name = "UMAP", 
    nNeighbors = 30, 
    minDist = 0.5, 
    metric = "cosine",
    force = TRUE
)})
umap_list <- lapply(names(proj_list), function(x){plotUmapQC(proj_list[[x]], "UMAP", "Sample", x, doubletScore=FALSE, coloringPalette=sample_palette)})
names(umap_list) <- names(proj_list)
options(repr.plot.width=25, repr.plot.height=60)
lapply(umap_list, function(x){ggpubr::ggarrange(plotlist=x, ncol=3, nrow=2)}) %>% ggpubr::ggarrange(plotlist=., ncol=1, nrow=3)

4. Doublet detection

overview

a) Amulet

amulet_res <- lapply(samples, function(sample){res <- amulet(inputFiles[sample],
                                                             barcodes = rownames(proj_list[[sample]]@cellColData) %>% gsub(paste0(sample, "#"), "", .),
                                                             regionsToExclude = GRanges(c("M","chrM","MT","X","Y","chrX","chrY"), IRanges(1L, width=10^8)), # excluding repeats, as well as sex and mitochondrial chromosomes
                                                             uniqueFrags = TRUE, # only use unique fragments
                                                             maxFragSize = 1000L, # maximum fragment size to consider
                                                             removeHighOverlapSites = TRUE); # remove sites that have more than two reads in unexpectedly many cells
                                               rownames(res) <- paste0(sample, "#", rownames(res));
                                               colnames(res) <- paste0("Amulet_", colnames(res));
                                               qsave(res, paste0("Amulet_DoubletDetection_", sample, ".qs"));
                                               return(res)})
for (sample in samples){
    proj_list[[sample]]@cellColData <- cbind(proj_list[[sample]]@cellColData, amulet_res[[sample]][match(rownames(proj_list[[sample]]@cellColData), rownames(amulet_res[[sample]])),])
    proj_list[[sample]]@cellColData$Amulet_doublet <- proj_list[[sample]]@cellColData$Amulet_q.value <= 0.05
}

b) Correlation with sequencing depth

plot_list <- list()

for (sample in samples){
    plot_list[["1"]][[sample]] <- ggplot(as.data.frame(proj_list[[sample]]@cellColData), aes(x = log10(Amulet_nFrags), y = log10(Amulet_q.value))) + ggpointdensity::geom_pointdensity() +
                                    ggtitle(sample) + 
                                    ggpubr::stat_cor(p.accuracy = 0.001, r.accuracy = 0.01, method = "spearman", size = 5) +
                                    theme_minimal() + theme(text = element_text(size = 15))
    plot_list[["2"]][[sample]] <- ggplot(as.data.frame(proj_list[[sample]]@cellColData), aes(x = log10(Amulet_nFrags), y = log10(Amulet_p.value))) + ggpointdensity::geom_pointdensity() +
                                    ggtitle(sample) + 
                                    ggpubr::stat_cor(p.accuracy = 0.001, r.accuracy = 0.01, method = "spearman", size = 5) +
                                    theme_minimal() + theme(text = element_text(size = 15))
}
options(repr.plot.width=18, repr.plot.height=5)
ggarrange(plotlist = plot_list[["1"]], ncol = 3)
ggarrange(plotlist = plot_list[["2"]], ncol = 3)
Warning message:
“Removed 34 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 34 rows containing non-finite values (`stat_cor()`).”
Warning message:
“Removed 31 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 31 rows containing non-finite values (`stat_cor()`).”
Warning message:
“Removed 2 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 2 rows containing non-finite values (`stat_cor()`).”
Warning message:
“Removed 34 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 34 rows containing non-finite values (`stat_cor()`).”
Warning message:
“Removed 31 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 31 rows containing non-finite values (`stat_cor()`).”
Warning message:
“Removed 2 rows containing non-finite values (`stat_pointdensity()`).”
Warning message:
“Removed 2 rows containing non-finite values (`stat_cor()`).”

c) Inspect doublets

umap_list <- list()

for (sample in samples){
    umap_list[[sample]] <- plotEmbedding(proj_list[[sample]], embedding = "UMAP", 
                                         colorBy = "cellColData", name = "Amulet_doublet",
                                         pal = c("FALSE" = "grey", "TRUE" = "darkred"), size = 0.5)
}
options(repr.plot.width=18, repr.plot.height=7)
ggarrange(plotlist = umap_list, ncol=3, nrow=1)
for (sample in samples){
    print(sample)
    print(table(proj_list[[sample]]@cellColData$Amulet_doublet))
    print(round(sum(proj_list[[sample]]@cellColData$Amulet_doublet) / nrow(proj_list[[sample]]@cellColData), 2))
}
[1] "MEF_IFNb6h_10xTn5"

FALSE  TRUE 
 4426   727 
[1] 0.14
[1] "MEF_IFNb6h_Tn5hc_30perc"

FALSE  TRUE 
 4812   997 
[1] 0.17
[1] "MEF_IFNb6h_Tn5hc"

FALSE  TRUE 
 4351  1261 
[1] 0.22

5. Filtering II

overview

a) Filtering by doublets

proj_list <- lapply(names(proj_list), function(x){proj_list[[x]][proj_list[[x]]$cellNames[!proj_list[[x]]$Amulet_doublet]]})
names(proj_list) <- samples

b) Sample Statistics

log10frags_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), log10nFrags = log10(x$nFrags))}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = log10nFrags)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("Number of fragments") + xlab("") + ylab("log10(nFrags)")
tss_samples <- ggplot(lapply(proj_list, function(x){data.frame(AnalysesGroups = factor(x$Samples, levels = samples), tss = x$TSSEnrichment)}) %>% do.call(rbind, .), aes(x = AnalysesGroups, y = tss)) + geom_violin(aes(fill = AnalysesGroups), alpha = 0.8) + geom_boxplot(alpha = 0.001) + 
                        theme_minimal() + theme(legend.position = "none", plot.title = element_text(size=30), axis.title = element_text(size=28), axis.text = element_text(size=28), axis.text.x=element_text(angle=90, vjust=1, hjust=1), 
                                                legend.title = element_text(size=28), legend.text = element_text(size=28)) +
                        scale_fill_manual(values = sample_palette) + ggtitle("TSS enrichment scores") + xlab("") + ylab("TSS enrichment score")
options(repr.plot.width=32, repr.plot.height=20)
ggarrange(log10frags_samples, tss_samples, ncol = 2)

c) Cell Statistics

p_list <- lapply(samples, function(sample){plotCellQuality(proj_list[[sample]], sample, groups = "Samples", 
                                                           set_xlim = c(2, 6.1), set_ylim = c(0, 50), 
                                                      cutoff_feature2 = minTSS[[sample]], cutoff_feature1 = minFrag[[sample]])})
names(p_list) <- samples
options(repr.plot.width=30, repr.plot.height=26)
ggarrange(plotlist = p_list, ncol = 2, nrow = 2)

d) Separate single-cell embeddings

proj_list <- lapply(proj_list, function(x){addIterativeLSI(
    ArchRProj = x,
    useMatrix = "TileMatrix", 
    name = "IterativeLSI", 
    iterations = 2, 
    clusterParams = list( #See Seurat::FindClusters
        resolution = c(0.2), 
        sampleCells = 10000, 
        n.start = 10
    ), 
    varFeatures = 25000, 
    dimsToUse = 1:30,
    force = TRUE
)})
IterativeLSI_list <- lapply(proj_list, function(x){getReducedDims(x, "IterativeLSI", returnMatrix = FALSE)})
options(repr.plot.width=21, repr.plot.height=5)
par(mfrow=c(1, 3))
for (x in samples){
    plot(IterativeLSI_list[[x]]$svd$d, bty='l', xlab='LSI components', main=x, ylab='SVD deviation', pch=16, cex.lab=1.2, cex.axis=1.1)
    plot(IterativeLSI_list[[x]]$svd$d, bty='l', xlab='LSI components', ylab='SVD deviation', pch=16, cex.lab=1.2, cex.axis=1.1, ylim=c(0,1500))
    plot(IterativeLSI_list[[x]]$corToDepth$none, bty='l', xlab='LSI components', ylab='Correlation to sequencing depth', pch=16, cex.lab=1.2, cex.axis=1.1)
}
LSIcomponents <- list(2:10, 2:10, 2:12, 2:12)
names(LSIcomponents) <- samples
proj_list <- lapply(names(proj_list), function(x){addIterativeLSI(
    ArchRProj = proj_list[[x]],
    useMatrix = "TileMatrix", 
    name = "IterativeLSI", 
    iterations = 2, 
    clusterParams = list( #See Seurat::FindClusters
        resolution = c(0.2), 
        sampleCells = 10000, 
        n.start = 10
    ), 
    varFeatures = 25000, 
    dimsToUse = LSIcomponents[[x]],
    force = TRUE
)})

names(proj_list) <- samples
proj_list <- lapply(proj_list, function(x){addUMAP(
    ArchRProj = x, 
    reducedDims = "IterativeLSI", 
    name = "UMAP", 
    nNeighbors = 30, 
    minDist = 0.5, 
    metric = "cosine",
    force = TRUE
)})
umap_list <- lapply(names(proj_list), function(x){plotUmapQC(proj_list[[x]], "UMAP", "Sample", x, doubletScore=FALSE, coloringPalette=sample_palette)})
names(umap_list) <- names(proj_list)
options(repr.plot.width=25, repr.plot.height=60)
lapply(umap_list, function(x){ggpubr::ggarrange(plotlist=x, ncol=3, nrow=2)}) %>% ggpubr::ggarrange(plotlist=., ncol=1, nrow=3)

6. Clustering of single cells

overview

a) Evaluate different clustering resolutions

umap_clusters_filtered <- lapply(proj_list, function(x){plotUmapClusters(x, reducedDims="IterativeLSI", 
                                           embedding="UMAP", resolutions = c(0.05, 0.1, 0.2))})
options(repr.plot.width=28, repr.plot.height=30)
lapply(umap_clusters_filtered, function(x){ggpubr::ggarrange(plotlist=x, ncol=3, nrow=1)}) %>% ggpubr::ggarrange(plotlist=., ncol=1, nrow=3)

b) Cluster cells

proj_list <- lapply(names(proj_list), function(x){addClusters(proj_list[[x]], 
                                                              reducedDims = "IterativeLSI", dimsToUse = LSIcomponents[[x]], 
                                                              method = "Seurat", name = "Clusters", resolution = 0.1)})
proj_list <- lapply(proj_list, function(x){x$Sample_cluster <- paste(x$Sample, x$Clusters, sep="_"); print(table(x$Sample_cluster)); return(x)})
names(proj_list) <- samples
MEF_IFNb6h_10xTn5_v2_C1 MEF_IFNb6h_10xTn5_v2_C2 MEF_IFNb6h_10xTn5_v2_C3 
                     22                      62                    2637 
MEF_IFNb6h_10xTn5_v2_C4 
                   1705 

MEF_IFNb6h_EMBLTn5_110_v2_C1 MEF_IFNb6h_EMBLTn5_110_v2_C2 
                          50                           41 
MEF_IFNb6h_EMBLTn5_110_v2_C3 MEF_IFNb6h_EMBLTn5_110_v2_C4 
                        2944                         1777 

MEF_IFNb6h_EMBLTn5_13_v2_C1 MEF_IFNb6h_EMBLTn5_13_v2_C2 
                         41                        1633 
MEF_IFNb6h_EMBLTn5_13_v2_C3 MEF_IFNb6h_EMBLTn5_13_v2_C4 
                       2284                         393 

c) Single-cell embeddings

umap_list <- lapply(proj_list, function(x){plotUmaps(x, embeddings = c("UMAP"), coloringLayer = "Sample_cluster")[[1]]})
options(repr.plot.width=20, repr.plot.height=20)
ggarrange(plotlist = umap_list, ncol=2, nrow=2)

7. Save ArchRProject

### Save ArchRProject
for (sample in samples){
    saveArchRProject(ArchRProj = proj_list[[sample]], outputDirectory = paste0("ArchRProj_", sample), load = FALSE)
}

#


Isabelle Seufert
Division of Chromatin Networks, DKFZ
12.09.2023

sessionInfo()
R version 4.2.2 (2022-10-31)
Platform: x86_64-conda-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /home/bq_ilander/miniconda3/envs/RWireX_v0.2.02/lib/libopenblasp-r0.3.21.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
 [1] parallel  stats4    grid      stats     graphics  grDevices utils    
 [8] datasets  methods   base     

other attached packages:
 [1] qs_0.25.4                   scDblFinder_1.12.0         
 [3] SingleCellExperiment_1.20.0 SeuratObject_4.1.3         
 [5] Seurat_4.3.0                purrr_0.3.5                
 [7] ggpubr_0.4.0                plotgardener_1.4.1         
 [9] ggExtra_0.10.0              RWireX_0.2.03              
[11] rhdf5_2.42.0                SummarizedExperiment_1.28.0
[13] Biobase_2.58.0              RcppArmadillo_0.11.4.2.1   
[15] Rcpp_1.0.9                  Matrix_1.5-3               
[17] GenomicRanges_1.50.1        GenomeInfoDb_1.34.2        
[19] IRanges_2.32.0              S4Vectors_0.36.0           
[21] BiocGenerics_0.44.0         sparseMatrixStats_1.10.0   
[23] MatrixGenerics_1.10.0       matrixStats_0.62.0         
[25] data.table_1.14.4           stringr_1.4.1              
[27] plyr_1.8.7                  ggplot2_3.4.0              
[29] gtable_0.3.1                gtools_3.9.4               
[31] gridExtra_2.3               devtools_2.4.5             
[33] usethis_2.1.6               ArchR_1.0.3                
[35] magrittr_2.0.3             

loaded via a namespace (and not attached):
  [1] utf8_1.2.2                spatstat.explore_3.0-6   
  [3] reticulate_1.26           tidyselect_1.2.0         
  [5] htmlwidgets_1.5.4         BiocParallel_1.32.1      
  [7] Rtsne_0.16                strawr_0.0.9             
  [9] ScaledMatrix_1.6.0        munsell_0.5.0            
 [11] codetools_0.2-18          ica_1.0-3                
 [13] xgboost_1.7.1.1           statmod_1.4.37           
 [15] scran_1.26.0              pbdZMQ_0.3-8             
 [17] future_1.29.0             miniUI_0.1.1.1           
 [19] withr_2.5.0               spatstat.random_3.1-3    
 [21] colorspace_2.0-3          progressr_0.11.0         
 [23] uuid_1.1-0                ROCR_1.0-11              
 [25] ggsignif_0.6.4            tensor_1.5               
 [27] listenv_0.8.0             repr_1.1.4               
 [29] GenomeInfoDbData_1.2.9    polyclip_1.10-4          
 [31] parallelly_1.32.1         vctrs_0.5.0              
 [33] generics_0.1.3            R6_2.5.1                 
 [35] ggbeeswarm_0.7.1          rsvd_1.0.5               
 [37] locfit_1.5-9.6            bitops_1.0-7             
 [39] rhdf5filters_1.10.0       spatstat.utils_3.0-1     
 [41] cachem_1.0.6              gridGraphics_0.5-1       
 [43] DelayedArray_0.24.0       assertthat_0.2.1         
 [45] promises_1.2.0.1          BiocIO_1.8.0             
 [47] scales_1.2.1              beeswarm_0.4.0           
 [49] beachmat_2.14.0           globals_0.16.1           
 [51] goftest_1.2-3             processx_3.8.0           
 [53] rlang_1.0.6               splines_4.2.2            
 [55] rtracklayer_1.58.0        rstatix_0.7.1            
 [57] lazyeval_0.2.2            spatstat.geom_3.0-6      
 [59] broom_1.0.1               plyranges_1.18.0         
 [61] yaml_2.3.6                reshape2_1.4.4           
 [63] abind_1.4-5               backports_1.4.1          
 [65] httpuv_1.6.6              tools_4.2.2              
 [67] ggplotify_0.1.0           ellipsis_0.3.2           
 [69] RColorBrewer_1.1-3        sessioninfo_1.2.2        
 [71] ggridges_0.5.4            base64enc_0.1-3          
 [73] zlibbioc_1.44.0           RCurl_1.98-1.9           
 [75] ps_1.7.2                  prettyunits_1.1.1        
 [77] deldir_1.0-6              viridis_0.6.2            
 [79] pbapply_1.7-0             cowplot_1.1.1            
 [81] urlchecker_1.0.1          zoo_1.8-11               
 [83] ggrepel_0.9.2             cluster_2.1.4            
 [85] fs_1.5.2                  scattermore_0.8          
 [87] lmtest_0.9-40             RANN_2.6.1               
 [89] fitdistrplus_1.1-8        stringfish_0.15.7        
 [91] pkgload_1.3.1             patchwork_1.1.2          
 [93] mime_0.12                 evaluate_0.18            
 [95] xtable_1.8-4              XML_3.99-0.12            
 [97] scater_1.26.0             compiler_4.2.2           
 [99] tibble_3.1.8              KernSmooth_2.23-20       
[101] crayon_1.5.2              htmltools_0.5.3          
[103] later_1.3.0               tidyr_1.2.1              
[105] RcppParallel_5.1.5        RApiSerialize_0.1.2      
[107] DBI_1.1.3                 MASS_7.3-58.1            
[109] car_3.1-1                 cli_3.4.1                
[111] metapod_1.6.0             igraph_1.3.5             
[113] pkgconfig_2.0.3           GenomicAlignments_1.34.0 
[115] sp_1.5-1                  scuttle_1.8.0            
[117] IRdisplay_1.1             plotly_4.10.1            
[119] spatstat.sparse_3.0-0     vipor_0.4.5              
[121] dqrng_0.3.0               XVector_0.38.0           
[123] yulab.utils_0.0.5         callr_3.7.3              
[125] digest_0.6.30             sctransform_0.3.5        
[127] RcppAnnoy_0.0.20          spatstat.data_3.0-0      
[129] Biostrings_2.66.0         leiden_0.4.3             
[131] edgeR_3.40.0              uwot_0.1.14              
[133] DelayedMatrixStats_1.20.0 restfulr_0.0.15          
[135] curl_4.3.3                shiny_1.7.3              
[137] Rsamtools_2.14.0          rjson_0.2.21             
[139] nlme_3.1-160              lifecycle_1.0.3          
[141] jsonlite_1.8.3            Rhdf5lib_1.20.0          
[143] BiocNeighbors_1.16.0      carData_3.0-5            
[145] limma_3.54.0              viridisLite_0.4.1        
[147] fansi_1.0.3               pillar_1.8.1             
[149] lattice_0.20-45           fastmap_1.1.0            
[151] httr_1.4.4                pkgbuild_1.3.1           
[153] survival_3.4-0            glue_1.6.2               
[155] remotes_2.4.2             png_0.1-7                
[157] bluster_1.8.0             stringi_1.7.8            
[159] profvis_0.3.7             BiocSingular_1.14.0      
[161] memoise_2.0.1             IRkernel_1.3.1           
[163] dplyr_1.0.10              irlba_2.3.5.1            
[165] future.apply_1.10.0